package com.tanhua.management.interceptor;

import com.tanhua.management.service.LoginService;
import com.tanhua.management.util.NoAuthorization;
import com.tanhua.management.util.UserThreadLocal;
import com.tanhua.management.vo.AdminVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 统一完成根据token查询用User的功能
 */
@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    private LoginService loginService;

    //在请求还没有到达controller的时候,将这个请求拦截下来
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //如果这个请求都不是向 controller 请求的,直接放行
        if (!(handler instanceof HandlerMethod)){
            return true;
        }

        //将这个拦截的 handler 请求 强转为 请求Controller层的 HandlerMethod
        //查看里面有没有 @NoAuthorization 这个注解
        if (((HandlerMethod) handler).hasMethodAnnotation(NoAuthorization.class)){
            //如果有,无需验证直接放行
            return true;
        }

        //截取请求对象的头信息,得到  Authorization 携带的 token
        String token = request.getHeader("Authorization");
        //String substring = token.substring(7);
            String substring=null;
            if (StringUtils.isNotEmpty(token)){
                substring = token.replace("Bearer ", "");
            }

        if (StringUtils.isNotEmpty(substring)){
            //如果这个 token 不为空 直接调用 方法 得到这个 user
            AdminVo adminVo = this.loginService.queryAdminByToken(substring);
            if (adminVo != null){
                //有值,说明token有效,将这个user存入 线程,方便在 其他地方通过 get 得到 user
                UserThreadLocal.set(adminVo);
                //存入之后放行
                return true;
            }
        }
        //到这一步,说明无效,直接返回错误
        response.setStatus(401); //无权访问
            System.out.println("好滴");
        return false;
    }
}
